<?php
require '../element/connection.php';
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// ---------------- CONFIG ----------------
$PAIR_AMOUNT   = 100;
$DIRECT_AMOUNT = 100;

$response = ["status" => "success", "message" => "No payout done."];

// Ensure logged-in user
if (!isset($_SESSION['user_id'])) {
    echo json_encode(["status" => "error", "message" => "Not logged in"]);
    exit;
}

$logged_in_user_id = $_SESSION['user_id'];

// ---------------- HELPER FUNCTIONS ----------------

// Recursively get all downline users under a leg (left/right)
function getLegUsers($conn, $user_id, $side) {
    $users = [];
    $stmt = $conn->prepare("SELECT $side FROM users WHERE user_id = ?");
    $stmt->bind_param("i", $user_id);
    $stmt->execute();
    $result = $stmt->get_result()->fetch_assoc();

    if (!empty($result[$side])) {
        $sideUserId = $result[$side];
        $users[] = $sideUserId;
        $users = array_merge($users, getLegUsers($conn, $sideUserId, 'left_side'));
        $users = array_merge($users, getLegUsers($conn, $sideUserId, 'right_side'));
    }
    return $users;
}

// Get directs (immediate referrals)
function getDirects($conn, $user_id) {
    $stmt = $conn->prepare("SELECT user_id FROM users WHERE sponsor_id = ?");
    $stmt->bind_param("i", $user_id);
    $stmt->execute();
    $res = $stmt->get_result();
    $directs = [];
    while ($row = $res->fetch_assoc()) {
        $directs[] = $row['user_id'];
    }
    return $directs;
}

// Filter out already counted users
function filterUncounted($conn, $user_id, $users, $type) {
    if (empty($users)) return [];
    $placeholders = implode(',', array_fill(0, count($users), '?'));
    $types = str_repeat('i', count($users));
    $query = "SELECT counted_user_id FROM counted_pairs WHERE user_id = ? AND type = ? AND counted_user_id IN ($placeholders)";
    $stmt = $conn->prepare($query);

    $params = array_merge([$user_id, $type], $users);
    // Prepare dynamic bind
    $bind_types = 'is' . $types; // i for user_id, s for type, i's for counted_user_id
    $stmt->bind_param($bind_types, ...$params);
    $stmt->execute();
    $res = $stmt->get_result();
    $already = [];
    while ($r = $res->fetch_assoc()) {
        $already[] = $r['counted_user_id'];
    }
    return array_diff($users, $already);
}

// ---------------- MAIN LOGIC ----------------

// Get left and right downline users
$leftUsers = getLegUsers($conn, $logged_in_user_id, 'left_side');
$rightUsers = getLegUsers($conn, $logged_in_user_id, 'right_side');
$directUsers = getDirects($conn, $logged_in_user_id);

// Filter already counted
$newLeft = filterUncounted($conn, $logged_in_user_id, $leftUsers, 'pair');
$newRight = filterUncounted($conn, $logged_in_user_id, $rightUsers, 'pair');
$newDirects = filterUncounted($conn, $logged_in_user_id, $directUsers, 'direct');

// Calculate 1:1 pairs
$pairsToPay = min(count($newLeft), count($newRight));
$pairIncome = $pairsToPay * $PAIR_AMOUNT;

// Direct income
$directIncome = count($newDirects) * $DIRECT_AMOUNT;
$totalIncome = $pairIncome + $directIncome;

// ---------------- RECORD PAYMENTS ----------------
if ($totalIncome > 0) {
    $conn->begin_transaction();

    // Update wallet
    $stmt = $conn->prepare("UPDATE users SET wallet = wallet + ? WHERE user_id = ?");
    $stmt->bind_param("ii", $totalIncome, $logged_in_user_id);
    $stmt->execute();

    // Insert counted pairs
    $insertStmt = $conn->prepare("INSERT INTO counted_pairs (user_id, counted_user_id, type, side, created_at) VALUES (?, ?, ?, ?, NOW())");

    foreach (array_slice($newLeft, 0, $pairsToPay) as $leftId) {
        $side = 'left';
        $type = 'pair';
        $insertStmt->bind_param("iiss", $logged_in_user_id, $leftId, $type, $side);
        $insertStmt->execute();
    }

    foreach (array_slice($newRight, 0, $pairsToPay) as $rightId) {
        $side = 'right';
        $type = 'pair';
        $insertStmt->bind_param("iiss", $logged_in_user_id, $rightId, $type, $side);
        $insertStmt->execute();
    }

    // Insert counted directs
    foreach ($newDirects as $directId) {
        $side = NULL;
        $type = 'direct';
        $insertStmt->bind_param("iiss", $logged_in_user_id, $directId, $type, $side);
        $insertStmt->execute();
    }

    $conn->commit();

    $response['message'] = "✅ Payout successful! ₹{$totalIncome} credited. (Pairs: ₹{$pairIncome}, Directs: ₹{$directIncome})";
} else {
    $response['message'] = "ℹ️ No new income available yet.";
}

// ---------------- MONTHLY SPECIAL 5% INCOME ----------------
$SPECIAL_PAIR_THRESHOLD = 5000; // 5000 users on left & right
$SPECIAL_AMOUNT = 500;        // Base amount
$SPECIAL_PERCENT = 0.05;      // 5%

if(count($leftUsers) >= $SPECIAL_PAIR_THRESHOLD && count($rightUsers) >= $SPECIAL_PAIR_THRESHOLD){
    
    // Get current month and year
    $month = date('m');
    $year  = date('Y');
    
    // Check if this special payout has already been given this month
    $stmt = $conn->prepare("SELECT COUNT(*) as cnt FROM monthly_special_income WHERE user_id = ? AND MONTH(created_at) = ? AND YEAR(created_at) = ?");
    $stmt->bind_param("iii", $logged_in_user_id, $month, $year);
    $stmt->execute();
    $res = $stmt->get_result()->fetch_assoc();
    
    if($res['cnt'] == 0){
        $specialIncome = $SPECIAL_AMOUNT * $SPECIAL_PERCENT;

        // Update wallet
        $stmtUpdate = $conn->prepare("UPDATE users SET wallet = wallet + ? WHERE user_id = ?");
        $stmtUpdate->bind_param("di", $specialIncome, $logged_in_user_id);
        $stmtUpdate->execute();

        // Record payout to avoid double counting
        $stmtInsert = $conn->prepare("INSERT INTO monthly_special_income (user_id, amount, created_at) VALUES (?, ?, NOW())");
        $stmtInsert->bind_param("id", $logged_in_user_id, $specialIncome);
        $stmtInsert->execute();

        $response['message'] .= " 💰 Monthly Special Income ₹{$specialIncome} credited!";
    }
}


// ---------------- DEBUG ----------------
$response['debug'] = [
    'leftCount' => count($leftUsers),
    'rightCount' => count($rightUsers),
    'directCount' => count($directUsers),
    'newLeft' => count($newLeft),
    'newRight' => count($newRight),
    'newDirects' => count($newDirects),
    'pairsToPay' => $pairsToPay,
    'pairIncome' => $pairIncome,
    'directIncome' => $directIncome,
    'totalIncome' => $totalIncome
];

echo json_encode($response);
exit;
?>
